﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entities;

namespace AccesoDatos
{
    public class DetallesFactura
    {
        public List<Producto> ObtenerCantidadVendidaProductos()
        {
            SqlConnection conexion = null;
            List<Producto> lstProductos = new List<Producto>();
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idProducto,cantidad FROM Detalle_Factura";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                Producto p = null;
                SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                while (dr.Read())
                {
                    p = new Producto();
                    p.CantVendida = Convert.ToInt32(dr["cantidad"]);
                    p.IdProducto = Convert.ToInt32(dr["idProducto"]);
                    if (lstProductos.Count > 0 && lstProductos.Contains(p))
                    {
                        lstProductos[lstProductos.IndexOf(p)].CantVendida += p.CantVendida;
                    }
                    else
                    {
                        lstProductos.Add(p);
                    }
                    p = null;
                }
                dr.Close();
                lstParametros.Clear();
                conexion.Close();
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al obtener cantidades vendidas.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al obtener cantidades vendidas.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return lstProductos;
        }
        public List<Producto> ObtenerCantidadVendidaProductos(List<Factura> lstFacturas)
        {
            SqlConnection conexion = null;
            List<Producto> lstProductos = new List<Producto>();
            try
            {
                conexion = DB.Conectar();
                string comando = "SELECT idProducto,cantidad FROM Detalle_Factura WHERE idFactura = @idFact";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                foreach (Factura item in lstFacturas)
                {
                    lstParametros.Add(new SqlParameter("@idFact", item.IdFactura));
                    SqlDataReader dr = DB.GenerarReader(comando, lstParametros, conexion);
                    Producto p = null;
                    while (dr.Read())
                    {
                        p = new Producto();
                        p.CantVendida = Convert.ToInt32(dr["cantidad"]);
                        p.IdProducto = Convert.ToInt32(dr["idProducto"]);
                        if (lstProductos.Count > 0 && lstProductos.Contains(p))
                        {
                            lstProductos[lstProductos.IndexOf(p)].CantVendida += p.CantVendida;
                        }
                        else
                        {
                            lstProductos.Add(p);
                        }
                        p = null;
                    }
                    dr.Close();
                    lstParametros.Clear();
                }
            }
            catch (SqlException ex)
            {
                //Con throw la información de la pila es mas profunda de donde se genero el error
                //En la capa de Presentación se Captura como Exception
                throw new Exception("Hubo un problema al obtener cantidades vendidas.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al obtener cantidades vendidas.", ex);
            }
            finally
            {
                conexion.Close();
            }
            return lstProductos;
        }
        public static List<Detalle_Factura> ObtenerDetallesDeFactura(int idFactura)
        {
            List<Detalle_Factura> lstDetalles = null;
            SqlConnection conexion = null;
            try
            {
                conexion = DB.Conectar();
                string sqlcmd = "SELECT idFactura, precioUnitario, cantidad FROM Detalle_Factura WHERE idFactura = @idFact";
                List<SqlParameter> lstParametros = new List<SqlParameter>();
                lstParametros.Add(new SqlParameter("@idFact", idFactura));
                Detalle_Factura df = null;
                lstDetalles = new List<Detalle_Factura>();
                SqlDataReader dr = DB.GenerarReader(sqlcmd, lstParametros, conexion);
                while (dr.Read())
                {
                    df = new Detalle_Factura();
                    df.IdFactura = Convert.ToInt32(dr["idFactura"]);
                    df.PrecioUnitario = (float)Convert.ToDouble(dr["precioUnitario"]);
                    df.Cantidad = Convert.ToInt32(dr["cantidad"]);
                    df.Subtotal = df.PrecioUnitario * df.Cantidad;
                    lstDetalles.Add(df);
                    df = null;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema al obtener detalles de facturas.", ex);
            }
            finally
            {
                if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
                    conexion.Close();
            }
            return lstDetalles;
        }
    }
}
